﻿using System;
using System.Windows;

namespace Hardcodet.Wpf.TaskbarNotification
{
	/// <summary>
	/// Helper class used by routed events of the
	/// <see cref="TaskbarIcon"/> class.
	/// </summary>
	static internal class RoutedEventHelper
	{
		#region RoutedEvent Helper Methods

		/// <summary>
		/// A static helper method to raise a routed event on a target UIElement or ContentElement.
		/// </summary>
		/// <param name="target">UIElement or ContentElement on which to raise the event</param>
		/// <param name="args">RoutedEventArgs to use when raising the event</param>
		static internal void RaiseEvent(DependencyObject target, RoutedEventArgs args)
		{
			if (target is UIElement)
				(target as UIElement).RaiseEvent(args);
			else if (target is ContentElement)
				(target as ContentElement).RaiseEvent(args);
		}

		/// <summary>
		/// A static helper method that adds a handler for a routed event 
		/// to a target UIElement or ContentElement.
		/// </summary>
		/// <param name="element">UIElement or ContentElement that listens to the event</param>
		/// <param name="routedEvent">Event that will be handled</param>
		/// <param name="handler">Event handler to be added</param>
		static internal void AddHandler(DependencyObject element, RoutedEvent routedEvent, Delegate handler)
		{
			UIElement uie = element as UIElement;
			if (uie != null)
				uie.AddHandler(routedEvent, handler);
			else
			{
				ContentElement ce = element as ContentElement;
				if (ce != null)
					ce.AddHandler(routedEvent, handler);
			}
		}

		/// <summary>
		/// A static helper method that removes a handler for a routed event 
		/// from a target UIElement or ContentElement.
		/// </summary>
		/// <param name="element">UIElement or ContentElement that listens to the event</param>
		/// <param name="routedEvent">Event that will no longer be handled</param>
		/// <param name="handler">Event handler to be removed</param>
		static internal void RemoveHandler(DependencyObject element, RoutedEvent routedEvent, Delegate handler)
		{
			UIElement uie = element as UIElement;
			if (uie != null)
				uie.RemoveHandler(routedEvent, handler);
			else
			{
				ContentElement ce = element as ContentElement;
				if (ce != null)
					ce.RemoveHandler(routedEvent, handler);
			}
		}

		#endregion
	}
}